

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User:周次煜
 * Date: 2024-03-22
 * Time：19:56
 */


package generarraylist;

import ArrayList.IList;
import ArrayList.NullArrayException;
import ArrayList.PosNotLegalException;

import java.util.Arrays;
public class GMyArrayList<T> implements IGList<T> {


    // 定义一个数组
    public Object []elem;

    //存放数据的长度
    public int usesize;

    // 默认容量大小
    public static final int DEFINESIZE=2;


    // 初始化顺序表
    public GMyArrayList() {

        elem=new Object[DEFINESIZE];

        try {
            CheckArrayNullException();
        } catch (NullArrayException e) {
            e.printStackTrace();
        }


    }




    // 尾插数据
    @Override
    public void add(T data) {
        if (isFull()) {
            this.elem= Arrays.copyOf(elem,2*elem.length);
        }
        this.elem[usesize]=data;
        usesize++;
    }

    // 检查合法性
    private void  IndexOutOfBoundsAdd(int pos) throws PosNotLegalException {
        if (pos<0 || pos > usesize) {
            throw new PosNotLegalException("顺序表下标异常，无法处理数据！");
        }
    }



    // 指定位置插入数据
    @Override
    public void add(int pos, T data) {
        try {
            IndexOutOfBoundsAdd(pos);
        } catch (PosNotLegalException e) {
            e.printStackTrace();
        }

        if (isFull()) {
            this.elem= Arrays.copyOf(elem,2*elem.length);
        }

        for (int i = usesize-1; i >=pos ; i--) {
            elem[i+1]=elem[i];
        }

        this.elem[pos]=data;
        this.usesize++;
    }


    // 声明一个下标查找和删除的异常
    private void  IndexOutOfBoundsFindandset(int pos) throws PosNotLegalException{
        if (pos<0 || pos >= usesize) {
            throw new PosNotLegalException("顺序表下标异常，无法处理数据！");
        }
    }

    // 检查数据是否包含
    @Override
    public boolean contains(T toFind) {

        for (int i = 0; i < usesize; i++) {
            if (elem[i].equals(toFind)) {
                return true;
            }
        }


        return false;
    }

    // 查找数据.索引
    @Override
    public int indexOf(T toFind) {

        if (isEmpty()) {
            System.out.println("顺序表无数据，查找失败！");
            return -1;
        }

        for (int i = 0; i < usesize; i++) {
            if (elem[i].equals(toFind)) {
                return i;
            }
        }

        System.out.println("不存在该数据，查找失败！");
        return -1;
    }


    // 得到顺序表数据
    @Override
    public T get(int pos) {

        return (T)elem[pos];
    }

    // 在指定位置修改数据
    @Override
    public void set(int pos, T value) {

       try {
           IndexOutOfBoundsFindandset(pos);
       } catch (PosNotLegalException e) {
           e.printStackTrace();
            return;
       }

       elem[pos]=value;

    }

    // 删除数据
    @Override
    public void remove(T toRemove) {
          int pos=this.indexOf(toRemove);
          try {
              IndexOutOfBoundsFindandset(pos);
          } catch (PosNotLegalException e) {
              e.printStackTrace();
                return;
          }

        for (int i = pos; i < usesize-1; i++) {
            elem[i] = elem[i + 1];
        }
        usesize--;

    }


    // 用户得到顺序表现有数据长度
    @Override
    public int size() {
        return usesize;
    }


    // 清除顺序表数据
    @Override
    public void clear() {
        for (int i = 0; i < elem.length; i++) {
            elem[i]=null;
        }
        usesize=0;
    }


    // 打印数据
    @Override
    public void display() {

        for (int i = 0; i < usesize; i++) {
            System.out.print(elem[i]+" ");
        }

        System.out.println();
    }


    // 检查数据是否满
    @Override
    public boolean isFull() {
        return usesize==elem.length;
    }


    // 检查数据是否为空
    @Override
    public boolean isEmpty() {
        return usesize==0;
    }


    // 异常检查： 顺序表是否为 null
    private void CheckArrayNullException() throws NullArrayException{
        if (elem==null) {
            throw new  NullArrayException("顺序表为 null 异常");
        }

    }
}
